package fiuba.td.fabrica.model.entities;

import java.util.Observable;

import fiuba.td.fabrica.model.vos.Tamanio;

/**
 * 
 */
public class Terreno extends Observable implements Cloneable {
	private String nombre;
	private Tamanio tamanio;
	private Fabrica fabrica;
	private double precioVenta;
	private double precioAlquiler;
	private boolean alquilado;
	private String imagen;
	
	public Terreno(String nombre, Tamanio tamanio, double precioVenta, double precioAlquiler, String imagen) {
		super();
		this.nombre = nombre;
		this.tamanio = tamanio;
		this.fabrica = null;
		this.precioVenta = precioVenta;
		this.precioAlquiler = precioAlquiler;
		this.alquilado = false;
		this.imagen = imagen;
	}
	
	
	public String getImagen() {
		return imagen;
	}

	public void setImagen(String imagen) {
		this.imagen = imagen;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public Tamanio getTamanio() {
		return this.tamanio;
	}
	
	public void setTamanio (Tamanio tamanio) {
		this.tamanio = tamanio;
	}

	public Fabrica getFabrica() {
		return fabrica;
	}

	public void setFabrica(Fabrica fabrica) {
		this.fabrica = fabrica;
	}

	public double getPrecioVenta() {
		return precioVenta;
	}

	public void setPrecioVenta(double precioVenta) {
		this.precioVenta = precioVenta;
	}

	public double getPrecioAlquiler() {
		return precioAlquiler;
	}

	public void setPrecioAlquiler(double precioAlquiler) {
		this.precioAlquiler = precioAlquiler;
	}

	public boolean isAlquilado() {
		return alquilado;
	}

	public void setAlquilado(boolean alquilado) {
		this.alquilado = alquilado;
	}

	
	protected Terreno clone() {
		return new Terreno (this.nombre, this.tamanio, this.precioVenta, this.precioAlquiler, this.imagen);
	}

	/**
	 * Metodo que debe invocarse cuando se compra un terreno.
	 * Se marca como no alquilado, y se crea la fabrica
	 * @param nombreFabrica
	 * @return
	 */
	public Terreno comprarTerreno (String nombreFabrica) {
		Terreno terreno = this.clone();

		terreno.setAlquilado(false);
		terreno.setFabrica(new Fabrica(nombreFabrica));
		
		// MVC
		setChanged();
		notifyObservers();
	
		return terreno;
	}

	/**
	 * Metodo que debe invocarse cuando se alquila un terreno.
	 * Se marca como alquilado, y se crea la fabrica
	 * @param nombreFabrica
	 * @return
	 */
	public Terreno alquilarTerreno (String nombreFabrica){
		Terreno terreno = this.clone();
		
		terreno.setAlquilado(true);
		terreno.setFabrica(new Fabrica(nombreFabrica));
		
		return terreno;
	}
	
	/** 
	 * Calcula los costos por mantenimiento
	 * @return
	 */
	public double calcularCostoMantenimientoMensual (){
		return (this.isAlquilado()) ? this.precioAlquiler : 0.0;
	}
	
	/**
	 * Metodo que se encarga de calcular el precio de venta del terreno
	 * que es del 80% del precio al que lo compre, y si tengo maquinas, estas
	 * tienen un precio de venta que se incluye tambien
	 * @return precio de venta
	 */
	public double vender (){
		double precioVenta = 0;
		if (! this.isAlquilado() ) {
			precioVenta = this.getPrecioVenta() * 0.8;
		}
		precioVenta += this.getFabrica().obtenerPrecioVenta();
		
		return precioVenta;
	}
	
}
